home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1843 / 1843.xpi / content / firebug / customizeShortcuts.js < prev    next >
Text File  |  2010-01-15  |  8KB  |  285 lines

  1. /* See license.txt for terms of usage */
  2. /* Reused code from Keyconfig by Dorando: http://mozilla.dorando.at/keyconfig.xpi*/
  3.  
  4. // ************************************************************************************************
  5. // Constants
  6.  
  7. const Cc = Components.classes;
  8. const Ci = Components.interfaces;
  9.  
  10. var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).QueryInterface(Ci.nsIPrefService);
  11. var branch = prefs.getBranch("extensions.firebug.key.shortcut.");
  12.  
  13. // Initialized from window parameters.
  14. var FBL; 
  15. var FBTrace;
  16.  
  17. // Global variables used by this dialog.
  18. var shortcutNames = null;
  19. var gVKNames = [];
  20. var gLocaleKeys = [];
  21. var gPlatformKeys = new Object();
  22. var updatedShortcuts = {}
  23. var modified = false;
  24. var mustBeKeyChars = {
  25.     VK_SEMICOLON      : ";",
  26.     VK_EQUALS         : "=",
  27.     VK_MULTIPLY       : "*",
  28.     VK_ADD            : "+",
  29.     VK_SUBTRACT       : "-",
  30.     VK_DECIMAL        : ".",
  31.     VK_DIVIDE         : "/",
  32.     VK_COMMA          : ",",
  33.     VK_PERIOD         : ".",
  34.     VK_SLASH          : "/",
  35.     VK_BACK_QUOTE     : "`",
  36.     VK_OPEN_BRACKET   : "[",
  37.     VK_BACK_SLASH     : "\\",
  38.     VK_CLOSE_BRACKET  : "]",
  39.     VK_QUOTE          : "'"
  40. };
  41.  
  42. // ************************************************************************************************
  43. // Implemantation
  44.  
  45. function init()
  46. {
  47.     var args = window.arguments[0];
  48.     FBL = args.FBL;
  49.     FBTrace = args.FBTrace;
  50.  
  51.     setKeyInfo();
  52.     shortcutNames = branch.getChildList("", {});
  53.     shortcutNames.sort();
  54.     shortcutNames.forEach(addShortcutRow);
  55.     setHandlers();
  56.     document.title = FBL.$STR('customizeShortcuts');
  57.  
  58. }
  59.  
  60. function setKeyInfo()
  61. {
  62.     gLocaleKeys = document.getElementById("localeKeys");
  63.     var platformKeys = document.getElementById("platformKeys");
  64.     gPlatformKeys.shift = FBL.$STR("VK_SHIFT", platformKeys);
  65.     gPlatformKeys.meta = FBL.$STR("VK_META", platformKeys);
  66.     gPlatformKeys.alt = FBL.$STR("VK_ALT", platformKeys);
  67.     gPlatformKeys.ctrl = FBL.$STR("VK_CONTROL", platformKeys);
  68.     gPlatformKeys.sep = FBL.$STR("MODIFIER_SEPARATOR", platformKeys);
  69.  
  70.     switch (prefs.getIntPref("ui.key.accelKey"))
  71.     {
  72.         case 17:
  73.             gPlatformKeys.accel = gPlatformKeys.ctrl;
  74.             break;
  75.         case 18:
  76.             gPlatformKeys.accel = gPlatformKeys.alt;
  77.             break;
  78.         case 224:
  79.             gPlatformKeys.accel = gPlatformKeys.meta;
  80.             break;
  81.         default:
  82.             gPlatformKeys.accel = (window.navigator.platform.search("Mac") == 0 ? gPlatformKeys.meta : gPlatformKeys.ctrl);
  83.     }
  84.  
  85.     for ( var property in KeyEvent)
  86.     {
  87.         gVKNames[KeyEvent[property]] = property.replace("DOM_", "");
  88.     }
  89.     gVKNames[8] = "VK_BACK";
  90. }
  91.  
  92. function setHandlers()
  93. {
  94.     var i;
  95.     var shortcutSinks = document.getElementsByClassName('shortcutSink');
  96.     for (i = 0; i < shortcutSinks.length; i++)
  97.     {
  98.         shortcutSinks[i].addEventListener('keydown', recognizeShortcut, false);
  99.     }
  100.     var resetBtns = document.getElementsByClassName('shortcutResetBtn');
  101.     for (i = 0; i < resetBtns.length; i++)
  102.     {
  103.         resetBtns[i].addEventListener('command', handleResetBtn, false);
  104.     }
  105. }
  106.  
  107. function saveChanges()
  108. {
  109.     if (!modified)
  110.         return true;
  111.  
  112.     if (window.confirm(FBL.$STR('keybindConfirmMsg')))
  113.     {
  114.         shortcutNames.forEach(saveShortcut);
  115.         window.opener.Firebug.ShortcutsModel.initShortcuts();
  116.         return true;
  117.     }
  118.  
  119.     return false;
  120. }
  121.  
  122. function saveShortcut(shortcutId, index, array)
  123. {
  124.     if (updatedShortcuts[shortcutId])
  125.         branch.setCharPref(shortcutId, updatedShortcuts[shortcutId]);
  126. }
  127.  
  128. function handleResetBtn(event)
  129. {
  130.     var element = event.target.id.replace('_reset', "");
  131.     if (branch.prefHasUserValue(element))
  132.     {
  133.         branch.clearUserPref(element);
  134.         modified = true;
  135.     }
  136.  
  137.     var textbox = document.getElementById(element + '_shortcut');
  138.     if (textbox)
  139.         textbox.value = getHumanShortcut(element);
  140. }
  141.  
  142. function getHumanShortcut(element)
  143. {
  144.     var shortcut = branch.getCharPref(element);
  145.     var tokens = shortcut.split(' ');
  146.     var keyCode = tokens.pop();
  147.  
  148.     if (keyCode.length == 1)
  149.         return getFormattedKey(tokens.join(','), keyCode, null);
  150.     else 
  151.         return getFormattedKey(tokens.join(','), null, keyCode);
  152. }
  153.  
  154. function addShortcutRow(element, index, array)
  155. {
  156.     //Get key configuration from preference
  157.     var shortcut = getHumanShortcut(element);
  158.     var rows = document.getElementById("shortcutGridRows");
  159.     var row = document.createElement("row");
  160.     var labelText;
  161.  
  162.     var label = document.createElement("label");
  163.     // Get the label from firebug.properties
  164.     labelText = FBL.$STR('firebug.shortcut.' + element + ".label");
  165.     if (labelText == "label") // $STR defaults to property name (label) if it's not defined. We don't want that
  166.         labelText = element
  167.     label.setAttribute("value", labelText);
  168.     row.appendChild(label);
  169.  
  170.     var textbox = document.createElement("textbox");
  171.     textbox.id = element + "_shortcut";
  172.     textbox.className = "shortcutSink";
  173.     textbox.setAttribute('tooltiptext', labelText + " shortcut");
  174.     textbox.setAttribute("value", shortcut);
  175.     row.appendChild(textbox);
  176.  
  177.     var resetBtn = document.createElement('button');
  178.     resetBtn.id = element + "_reset";
  179.     resetBtn.setAttribute('label', FBL.$STR("a11y.labels.reset"));
  180.     resetBtn.setAttribute('aria-label', FBL.$STRF("a11y.labels.reset_shortcut", [labelText]));
  181.     resetBtn.className = "shortcutResetBtn";
  182.     row.appendChild(resetBtn);
  183.     rows.appendChild(row);
  184. }
  185.  
  186. function recognizeShortcut(event)
  187. {
  188.     //we're using keydown, so we always start with keycode
  189.     var shortcut = "";
  190.     if ( [9, 16, 17, 18].indexOf(event.keyCode) != -1 ||
  191.         ((!event.shiftKey && !event.altKey && !event.ctrlKey) &&
  192.         [ 8, 13, 27].indexOf(event.keyCode) != -1))
  193.     {
  194.         //Always let tab pass. Let enter, escape & backspace pass if no modifiers are used
  195.         return;
  196.     }
  197.  
  198.     modified = true;
  199.     event.preventDefault();
  200.     event.stopPropagation();
  201.  
  202.     var target = event.target;
  203.     var modifiers = [];
  204.     if (event.altKey)
  205.         modifiers.push("alt");
  206.     if (event.ctrlKey)
  207.         modifiers.push("control");
  208.     if (event.metaKey)
  209.         modifiers.push("meta");
  210.     if (event.shiftKey)
  211.         modifiers.push("shift");
  212.  
  213.     modifiers = modifiers.join(" ");
  214.     var keyConstant = key = null;
  215.  
  216.     keyConstant = gVKNames[event.keyCode];
  217.  
  218.     if (!keyConstant) //should not happen
  219.         return;
  220.  
  221.     //check if the keycode is actually a printable character
  222.  
  223.     //1. convert some of the punctuation keyConstants (e.g. VK_COMMA) back to actual characters
  224.     if (mustBeKeyChars[keyConstant])
  225.     {
  226.         key = mustBeKeyChars[keyConstant];
  227.     }
  228.     else
  229.     {
  230.         //2. detect basic alphanumeric keys
  231.         var keyNameGuess = keyConstant.replace("VK_", "");
  232.         if (keyNameGuess.length == 1)
  233.             key = keyNameGuess.toLowerCase();
  234.     }
  235.  
  236.     if (modifiers.length > 0)
  237.     {
  238.         shortcut += modifiers;
  239.         shortcut += " ";
  240.     }
  241.     shortcut += (key ? key : keyConstant);
  242.  
  243.     updatedShortcuts[target.id.replace('_shortcut', "")] = shortcut;
  244.  
  245.     //show formatted shortcut in textbox
  246.     modifiers = modifiers.replace(" ",",")
  247.     var formatted = getFormattedKey(modifiers, key, keyConstant);
  248.  
  249.     target.value = formatted;
  250.     return false;
  251. }
  252.  
  253. function getFormattedKey(modifiers, key, keyConstant)
  254. {
  255.     if (modifiers == "shift,alt,control,accel" && keyConstant == "VK_SCROLL_LOCK")
  256.         return "";
  257.     if (key == "" || (!key && keyConstant == ""))
  258.         return "";
  259.  
  260.     var val = "";
  261.     if (modifiers)
  262.         val =
  263.         modifiers.replace(/^[\s,]+|[\s,]+$/g, "").split(/[\s,]+/g).join(gPlatformKeys.sep).replace("alt", gPlatformKeys.alt).replace("shift", gPlatformKeys.shift).replace("control",
  264.         gPlatformKeys.ctrl).replace("meta", gPlatformKeys.meta).replace("accel", gPlatformKeys.accel)
  265.         + gPlatformKeys.sep;
  266.  
  267.     if (key)
  268.         return val += key;
  269.  
  270.     if (keyConstant)
  271.     {
  272.         try
  273.         {
  274.             //see if a localized version for keyConstant exists (F keys, arrow, enter, pgup, etc.)
  275.             val += gLocaleKeys.getString(keyConstant);
  276.         }
  277.         catch (e)
  278.         {
  279.             //create human friendly alternative ourself
  280.             val += keyConstant.replace("VK_", "").replace("_", " ").toLowerCase();
  281.         }
  282.     }
  283.     return val;
  284. }
  285.